$.fn.extend({
			/**
			 * 拖动某个标签
			 * 
			 * @param {}
			 *            options
			 */
			// dom拖动
			drag : function(options) {
				var o = {
					// 被拖拽体是否回滚
					rollback : false,
					mouseup : function() {
					},
					mousedown : function() {
					}
				};

				$.extend(o, options);

				var $drag = $(this);
				$drag.css({
							position : "absolute"
						})

				var dragFlag = false;
				var offset = "", dx = 0, dy = 0;
				// 初始位置
				var oldSite = {
					x : 0,
					y : 0
				};
				// 当前位置
				var nowSite = {
					x : 0,
					y : 0
				};
				// 是否在回滚中
				var isRB = false;

				$drag.mousedown(function(e) {
							if (!isRB) {
								offset = $drag.offset();
								// 获取鼠标在图片中位置
								dx = e.pageX - offset.left;
								dy = e.pageY - offset.top;
								// 获取初始定位
								oldSite.x = offset.left;
								oldSite.y = offset.top;
								// 回调
								o.mousedown();

								dragFlag = true;
							}
							return false;
						});

				$(document).mouseup(function() {
							if (!isRB) {
								offset = $drag.offset();
								// 获取当前位置
								nowSite.x = offset.left;
								nowSite.y = offset.top;
								dragFlag = false;

								o.mouseup();
								if (o.rollback) {
									moveOldSite();
								}
							}
							return false;
						});

				$(document).mousemove(function(e) {
							if (dragFlag) {
								$drag.css({
											left : e.pageX - dx,
											top : e.pageY - dy
										});
							}
							return false;
						});

				// 回归原位

				var moveOldSite = function() {

					// 未移动位置则部回滚
					if ((nowSite.x == oldSite.x) && (nowSite.y == oldSite.y)) {
						return;
					}

					// 开启回滚标志
					isRB = true;

					// 移动次数
					var stepCount = 20;

					// 当前位置到初始位置的距离
					var distance = {
						x : Math.abs(nowSite.x - oldSite.x),
						y : Math.abs(nowSite.y - oldSite.y)
					};
					

					// 移动步长
					var step={x:0,y:0};

					if (distance.x <= stepCount) {
						step.x = 1;
					} else {
						// 取四舍五入的步长，以减少移动到最后一步后，距离初始位置的误差
						step.x = Math.round(distance.x / stepCount);
					}
					if (distance.y <= stepCount) {
						step.y = 1;
					} else {
						// 取四舍五入的步长，以减少移动到最后一步后，距离初始位置的误差
						step.y = Math.round(distance.y / stepCount);
					}

					// debug
					//$("body").append(distance.x + "==" + step.x + "<br/>");

					var timer = setInterval(function() {
								// 步长为0 并且 位置未变化 则不移动
								// Math.abs(nowSite.x-oldSite.x)>=stepX
								// nowSite.x !=oldSite.x
								
                                if (step.x != 0
										&&nowSite.x !=oldSite.x) {
									if (nowSite.x > oldSite.x) {
										nowSite.x -= step.x;
									} else {
										nowSite.x += step.x;
									}
								}
								if (step.y != 0
										&& nowSite.y !=oldSite.y) {
									if (nowSite.y > oldSite.y) {
										nowSite.y -= step.y;
									} else {
										nowSite.y += step.y;
									}
								}
                        
//                                nowSite.x-=step.x;
//                                nowSite.y-=step.y;
                                
                                
                                
								$drag.css({
											left : nowSite.x,
											top : nowSite.y
										});
                          
                                        

								// $("body").append(stepCount + ":" + nowSite.x
								// +
								// "<br/>");
								stepCount--;

								if (stepCount == 0) {
									
									clearTimeout(timer);
									$drag.css({
												left : oldSite.x,
												top : oldSite.y
											});
									isRB = false;
								}

							}, 15);// 15
				};
			}
		});